package com.apobates.jforum2.troll.replies.biz;

import com.apobates.jforum2.troll.replies.entity.MoodCollectResult;
import com.apobates.jforum2.troll.replies.entity.PostsMoodRecords;
import com.apobates.jforum2.troll.utils.core.api.ActionEventCulpritor;
import com.apobates.jforum2.troll.utils.persistence.Page;
import com.apobates.jforum2.troll.utils.persistence.Pageable;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Stream;

/**
 *
 * @author xiaofanku
 * @since 20200527
 */
public interface PostsMoodRecordsService {
    /**
     * 查看指定回复的喜好记录
     *
     * @param postsId 回复ID
     * @param pageable 分页请求参数
     * @return
     */
    Page<PostsMoodRecords> getAllByPosts(long postsId, Pageable pageable);
    
    /**
     * 查看指定回复的喜好记录
     *
     * @param postsId 回复ID
     * @param liked 是否为赞,true,false为讨厌
     * @return
     */
    Stream<PostsMoodRecords> getByPosts(long postsId, boolean liked);
    
    /**
     * 查看指定话题的回复喜好汇总记录
     *
     * @param topicId 话题ID
     * @param page 最几页
     * @param pageSize 每页显示的数量
     * @return
     */
    List<MoodCollectResult> getByTopic(long topicId, int page, int pageSize);
    
    /**
     * 查看指定的回复喜好汇总记录
     *
     * @param topicId 话题ID
     * @param postsIdSet 回复ID集合
     * @return
     */
    List<MoodCollectResult> getByPosts(long topicId, Set<Long> postsIdSet);

    /**
     * 查看指定的回复喜好汇总记录
     *
     * @param topicId 话题ID
     * @param postsId 回复ID
     * @return
     */
    Optional<MoodCollectResult> getByPostsId(long topicId, long postsId);

    /**
     * 创建喜好记录.若会员已对回复的喜好记录存在方法会删除并返回成功
     * 注意: 不要在此方法的实现上增加注解ActionDescriptor,它不符合注解的要求
     * @param id 回复ID
     * @param topicId 话题ID
     * @param like 是否为赞,true,false为讨厌
     * @param culpritor 操作的肇事信息
     * @return -1表示删除喜好,大于0表示喜好增加成功,0喜好增加失败
     */
    long toggleMoodRecord(long id, long topicId, boolean like, ActionEventCulpritor culpritor);

    /**
     * 切换点赞记录.若会员已对回复点过赞了会取消
     * @deprecated
     * @param id 回复ID
     * @param topicId 话题ID
     * @param culpritor 操作的肇事信息
     * @return 大于0表示点赞/取消点赞成功(返回回复的ID),0表示操作失败
     */
    //long toggleLikedRecord(long id, long topicId, ActionEventCulpritor culpritor);

    /**
     * 切换讨厌记录.若会员已对回复点过讨厌了会取消
     * @deprecated
     * @param id 回复ID
     * @param topicId 话题ID
     * @param culpritor 操作的肇事信息
     * @return 大于0表示讨厌/取消讨厌成功(返回回复的ID),0表示操作失败
     */
    //long toggleDisLikedRecord(long id, long topicId, ActionEventCulpritor culpritor);
}